<?php
/**
 *
 * класс ProductController
 * путь product/
 */
class ProductController extends AbstractModule implements IObservable{

    private $observers;
    private $model;
    private $view;
    public function __construct() {
        parent::__construct(); 
        
        $this->setAllowedPaths(array(
            'index',
            'show',
            'show/%num%',
            'add/%num%',
        ));
        
        $this->addObserver($this->messagesobserver);
        $this->model = new ProductModel();
        $this->view = new ProductView();
    }
    
     
    public function index() {
        return $this->doAction($this->router->getAction('Product/show'));
    }
   /**
    *
    * Путь product/show
    * Страница вывода всех продуктов или страница одного продукта
    * 
    * @return boolean 
    */
    public function show() {
        $args = func_get_args();

        $product_id = @$args[0];

        if (!$this->user->isLogged)
            return false;
        
        $pagedata = array();     
        //вывод одного продукта на страницу
        if (!empty($product_id) && $product = $this->model->getProductById($product_id)) {
     
           //устанавливаем активные подмодули
           $this->setActiveSubmodule('comments');
           $this->setActiveSubmodule('favoritesadder');
            
            $pagedata[] = array('data'=> ProductView::getProduct($product), 'region'=>'content');
        } else {
            //пполучаем все продукты по какому-то критерию которого ещё нет
            $products = $this->model->getProductsByCriteria(array());
            $data = array();
            $data['rows'] = $products->rows;
            $data['company_id'] = $this->user->ownerof;

            $pagedata[] = array('data'=> ProductView::getPoducts($data), 'region'=>'heap');
        }
        $this->output($pagedata);
        return true;
    }
    /**
     * Реализация INameable
     *  
     * @param type $path
     * @return string|boolean 
     */
    public static function getPageName($path) {
        $args = array();
        parent::preparePath($path, $args);
        switch ($path) {
            case 'product/show/%':
                $registry = Registry::getInstance();
                $registry->load->model('Product');
                $data = $registry->model->getNameById($args[0]);

                return str_replace('%product', $data, 'Страница продукта &laquo%product&raquo');
            case 'product':
                return 'Товары';
            default:
                return false;
        }
    }
    
    /**
     * Валидатор для формы добавления продукта
     * @param type $_POST
     * @return boolean 
     */
    private function addValidation($_POST) {
        return true;
    }
    /**
     *
     * обработчик для формы добавления продукта
     * 
     * @param type $_POST
     * @return type 
     */
    private function addSubmit($_POST) {
        return $this->model->insertProduct($_POST);
    }
    /**
     * Страница добавлени продукта
     * 
     * @return boolean 
     */
    public function add() {
        
        $args = func_get_args();
        
        $company_id = $args[0];
        
//        $this->load->model('Company');
        
        if(!is_numeric($company_id) || $company_id<0) return false;
        if(!$this->user->isLogged) return false;
        
        $model = new CompanyModel();
        $company = $model->getCompanyById($company_id);
        if(empty($company)) return false;
        if($this->user->ownerof!=$company_id) return false;
        
        if (@$_POST['submit']) {
            if($this->addValidation($_POST) === TRUE)
            {
                if($this->addSubmit($_POST))
                {
                    $this->fireEvent('message', array('message'=>"Товар успешно добавлен!"));
                }
            }
        }
        
        $pagedata = array();     
        $pagedata[] = array('data'=> ProductView::getAddProductForm($company_id, $this->user->ownerof), 'region'=>'content');
        $this->output($pagedata);

        return true;
    }
    /**
     * Реализация интерефейса IObservable
     * 
     * @param type $eventType
     * @param type $data 
     */
    public function fireEvent($eventType, $data) {

        if (is_array($this->observers)) {
            foreach ($this->observers as $objObserver) {
                $objObserver->notify($eventType, $data);
            }
        }
    }
    /**
    * Реализация интерефейса IObservable
    * 
    * @param type $eventType
    * @param type $data 
    */
    public function addObserver(IObserver $obs) {
        $this->observers[] = $obs;
    }

    public function delete() {
        
    }

    public function install() {
        
    }
}

?>